/**@file
   Kernel stub device class
   
   @par license 
   Copyright 2012 Lu, Ken. All rights reserved.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
 
   @author: Lu, Ken (bluewish.ken.lu@gmail.com)
**/

#ifndef _SYSPY_SYSTEM_KSTUB_H_
#define _SYSPY_SYSTEM_KSTUB_H_

#include <Windows.h>
#include <syspy/types.h>
#include <string>

using namespace std;

namespace ken {

class u_KStubDev
{
public:
    static u_KStubDev* instance() {
        if (u_KStubDev::instance_ == NULL) {
            u_KStubDev::instance_ = new u_KStubDev();
        }

        return u_KStubDev::instance_;
    }

    static void set_driver_path(wstring path) {
        driver_dir_ = path;
    }

    u32_t ioread(u16_t port, u8_t width);
    void  iowrite(u16_t port, u8_t width, u32_t in);
    void  mmioread(un_t base, u32_t &length, u8_t *out);
    void  mmiowrite(un_t base, u32_t length, u8_t *in);
    bool  mmioscan(un_t base, u32_t length, u8_t *in, u32_t inlen, u32_t &first);

private:
    u_KStubDev();
    ~u_KStubDev();

private:
    static u_KStubDev*  instance_;
    static wstring      driver_dir_;

    HANDLE device_;
    void load();
    void unload();

    DISALLOW_COPY_AND_ASSIGN(u_KStubDev);
}; // class

} // namespace

#endif // _SYSPY_SYSTEM_KSTUB_H_